javascript closures

1、闭包定义:当函数可以记住并访问所在的 词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。

        function foo(){
            var a = 2;
            function bar(){
                console.log( a );
            }
            bar();   // 函数bar() 可以访问外部作用域中的 变量a
        }
        foo();

        function foo()
        {
            var a = 2;
            function bar()
            {
                console.log(a);
            }
            return bar;
        }
        var baz = foo();
        baz();  // 2 闭包的效果

        bar()所引用的函数对象本身当作返回值

2、本质上,如果将(访问他们各自词法作用域的)函数当作第一级的值类型并到处传递,你就会看到闭包在函数中的应用。比如:定时器、事件监听器、ajax请求、跨窗口通信、web workers,只要使用了回调函数,就是在使用闭包。

        function wait(msg)
        {
            setTimeout(function timer(){
                console.log(msg);
                },1000);
        }

        wait('hello closure');

3、循环和闭包

        for(var i=1;i<=5;i++){
            setTimeout(function timer(){
                console.log(i);
                },i*1000)
        }

        for(var i=1;i<=5;i++){
            (function(j){
                setTimeout(function timer(){
                    console.log(j);
                    },j*1000)
                })(i);
        }

        //let
        for(var i=1;i<=5;i++){
            let j = i;
            setTimeout(function timer(){
                console.log(j);
                },j*1000)
        }

        for(let i=1;i<=5;i++){
            setTimeout(function timer(){
                console.log(i);
                },i*1000)
        }

4、模块